package com.ja10.books;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import android.util.Log;

public class ReserveDay {
	
	final String PATH = "http://192.168.3.190:8080/Books/book_img/";
	
	private BookList book = null;
	Connection con = null;
	Statement smt = null;

	public ReserveDay() {
		// TODO 自動生成されたコンストラクター・スタブ
	}
	
	
	//----------------　貸出予定日を導き出すメソッド//　　予約者数/所蔵数　
	public String ReturnPlanDate(java.util.Date calendar, String isbn,int reserve_members,int stock_books,boolean I_reserved) throws SQLException{
				
				Calendar rentalday = Calendar.getInstance();
				
			if(I_reserved){
					reserve_members = reserve_members-1;
				}
				
				int x = 0;
				int y = reserve_members;
				
				int rental_books = this.RentalNumbers(isbn);
				
				//予約者がいる場合、所蔵数を予約者で割って自分が何番目に借りれるかを計算
				if(reserve_members != 0){
					
					
					//一冊当たりの予約人数
					x = reserve_members/stock_books;
					//どの本に対する待ちかの割り当て
					y = reserve_members%stock_books;
				}
					int waitday= 0;
	//				String rentalday=null;
					String s_rentalday=null;
				
					//　SQLを発行するためのStatementオブジェクトを取得
					con = DBManager.getConnection();
					smt = con.createStatement();

					//　SQL文を記述（書籍テーブルから該当する書籍の貸出ＩＤを古い順に並べる）
					String sql = "SELECT rental_id FROM books WHERE isbn ='" + isbn + "' ORDER BY rental_id DESC";
					
					//　StatementオブジェクトのexecuteQuery()メソッドでSQLを発行(検索)
					ResultSet rs = smt.executeQuery( sql );
				
				    //貸出中の書籍の貸出日を取りだす
					for (int i = 0; i<= y ; i++){
						rs.next();
						
						int rental_id = rs.getInt("rental_id");
						
						if( rs.wasNull()){
							rentalday.setTime(calendar);
						}else{
							sql = "SELECT rental_date FROM rentals WHERE id ='" + rs.getInt("rental_id") + "'";
							ResultSet rs_rental = smt.executeQuery( sql );
	//						rentalday.setTime(rs_rental.getDate("rental_date"));
							rs_rental.next();
							s_rentalday = rs_rental.getString("rental_date");
										
							rentalday = this.day(s_rentalday);
						}
											
					}
					//待つ日にち＝（自分より」前で」待っている人数+現在借りている人）*最大貸出期間
					if(rental_books != 0){
						waitday =  (x+1)*14;
					}else{
						waitday =  x*14;
					}
					
					rentalday.add(rentalday.DATE, waitday);
				
					rs.close();

				String planday = String.format("%02d年%02d月%02d日",
						rentalday.get(Calendar.YEAR),
						rentalday.get(Calendar.MONTH)+1,
						rentalday.get(Calendar.DATE));
				
				if( smt != null ){try {smt.close();} catch (java.sql.SQLException e) {e.printStackTrace();}}
				if( con != null ){try{con.close();} catch (java.sql.SQLException e) {e.printStackTrace();}}
					
				return planday;
				
			}

//----------------　対象の蔵書数を調べるメソッド
		public int Numbers(String table,String isbn) throws SQLException{
				
				int stock_books = 0;
				
				//　SQLを発行するためのStatementオブジェクトを取得
				con = DBManager.getConnection();
				smt = con.createStatement();
				
			
				String sql_isbn = "select * from books where isbn = '" + isbn + "'";

				//　StatementオブジェクトのexecuteQuery()メソッドでSQLを発行(検索)
				ResultSet rs = smt.executeQuery( sql_isbn );
				
				/*所蔵数をリクエスト情報にセットする
				  書籍テーブルからISBNが同一のレコード件数を検索し所蔵数とする
				  書籍テーブルからISBNが同一のレコードを検索する
				*/
			
					Statement stm = con.createStatement();
					rs = stm.executeQuery(sql_isbn);

					while (rs.next()) {
						System.out.println("isbn : " + rs.getString("isbn") + " book_id : " + rs.getInt("id"));

						//所蔵数 ＝ レコード件数
						stock_books++;
					}
				rs.close();
				if( smt != null ){try {smt.close();} catch (java.sql.SQLException e) {e.printStackTrace();}}
				if( con != null ){try{con.close();} catch (java.sql.SQLException e) {e.printStackTrace();}}
				
				return stock_books;
				
			}
						
//----------------　貸出中冊数を調べるメソッド
		public int RentalNumbers(String isbn) throws SQLException{
			
				int rental_books = 0;
				
				//　SQLを発行するためのStatementオブジェクトを取得
				con = DBManager.getConnection();
				smt = con.createStatement();
				
			
				String sql_isbn = "select * from books where isbn = '" + isbn + "'";

				//　StatementオブジェクトのexecuteQuery()メソッドでSQLを発行(検索)
				ResultSet rs = smt.executeQuery( sql_isbn );
				
				/*所蔵数をリクエスト情報にセットする
				  書籍テーブルからISBNが同一のレコード件数を検索し所蔵数とする
				  書籍テーブルからISBNが同一のレコードを検索する
				*/
			
					Statement stm = con.createStatement();
					rs = stm.executeQuery(sql_isbn);

					while (rs.next()) {
						System.out.println("isbn : " + rs.getString("isbn") + " book_id : " + rs.getInt("id"));
						
						System.out.println("isbn : " + rs.getString("isbn") + " rental_id : " + rs.getInt("rental_id"));

						//貸出中冊数 ＝ 貸出IDがセットされているレコード件数
						if (rs.getInt("rental_id") > 0) {
							System.out.println("isbn : " + rs.getString("isbn") +
											   " book_id : " + rs.getInt("id") +
											   " rental_id : " + rs.getInt("rental_id"));
							rental_books++;
						}

					}
				rs.close();
				if( smt != null ){try {smt.close();} catch (java.sql.SQLException e) {e.printStackTrace();}}
				if( con != null ){try{con.close();} catch (java.sql.SQLException e) {e.printStackTrace();}}
				
				return rental_books;
				
			}
		
//----------------　予約者数を調べるメソッド
		public int ReserveMembers(java.util.Date time ,String isbn) throws SQLException{
			
			book = new BookList();
			int reserve_members = 0;
			
			//　SQLを発行するためのStatementオブジェクトを取得
			con = DBManager.getConnection();
			smt = con.createStatement();
				
			Calendar reservedate = Calendar.getInstance();
			Calendar othercalendar = Calendar.getInstance();
			
			reservedate.setTime(time);
			
			String sql_reserve = "select reserve_date from reserves where book_isbn = ? ";
			PreparedStatement sql_r = con.prepareStatement(sql_reserve);
			
				//予約数 ＝ 検索結果のレコードの書籍ＩＤで予約テーブルを検索し、該当するレコード件数を予約数
				sql_r.setString(1, isbn);
				ResultSet rs = sql_r.executeQuery();
				
				if (rs.next()) {
					othercalendar.setTime(rs.getDate("reserve_date"));
//					othercalendar = this.day(rs.getString("reserve_date"));
					int diff = reservedate.compareTo(othercalendar);
					
					if(diff > 0){
						reserve_members++;
					}
				}
			rs.close();
			return reserve_members;
			
		}
		
		
//----------------　Ｓｔｒｉｎｇ型で取得した曜日データをcalendarDateに変えるメソッド
		public Calendar day(String reserveday){
			
			Calendar calendar = Calendar.getInstance();
			
			int year = Integer.parseInt(reserveday.substring(0, 4));
			
			int month 	= Integer.parseInt(reserveday.substring(5, 7));
			
			if(month == 1){
				month = 12;
			}else{
				month = month - 1;
			}
			int day 	= Integer.parseInt(reserveday.substring(8, 10));
			
			calendar.set(year, month, day);
			SimpleDateFormat sdf=new SimpleDateFormat();
			
			
			return calendar;
				
		}
		
//----------------　現在の時刻メソッド
		public String NowTime(){
			Calendar calendar = Calendar.getInstance();
			String time = String.format("%02d-%02d-%02d",
										calendar.get(Calendar.YEAR),
										calendar.get(Calendar.MONTH)+1,
										calendar.get(Calendar.DATE));
			return time;
			
		}


}
